03. august 2004 - 17:58Der er
22 kommentarer og 2 løsninger
Generere ikke-så-tilfældig række tegn
Heysan,
står lige og mangler en metode til at generere en række tegn.
Systemet er således: Det skal egentlig virke lidt ligesom auto_increment i mysql, men med både bogstaver OG tal...
rækkefølgen er a-z 2-9 (følgende (skal kunne ændres) er udeladt: o, 1, l, 0 (nul), samt blokbogstaver)
således at: efter "a" kommer "b" efter "b" kommer "c" [...] efter "z" kommer "2" efter "9" kommer "aa" efter "aa" kommer "ab" etc etc etc
de forskellige kombinationer skal gemmes i en database, og såfremt der genereres en tegn-kombination der allerede findes i databasen, skal den selvfølgelig springes over, og hoppes videre til den næste frie kombination, ved at følge ovenstående mønster.
Det er lidt svært at forklare - håber i fanger idéen, ellers må i lige spørge :-)
//Tjekker om pass findes i databasen $db_connect = mysql_connect("localhost", "medieburner", "tils9217") or die(mysql_error()); mysql_select_db("pass", $db_connect) or die(mysql_error());
$pass_res = mysql_query("SELECT * FROM pass WHERE pass = '$pass'") or die(mysql_error()); $pass_antal = mysql_num_rows($pass_res);
if($pass_antal >= 1) { $pass = $make_password(); } else { //Indsæt i database mysql_query("INSERT INTO pass (pass) VALUES ('$pass')") or die(mysql_error()); } }
Det gælder vel så bare om at lave en ordentlig algoritme ...
Nu hører php jo ikke under mine egenskaber, men her er en javascript-ting, som ikke præcis er optimeret, men jeg regner med at du kan finde ud af at ændre det til php !-)
-- og den er sat i et html-dokument, så det er nemt at checke den for mærkværdigheder:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Lav koder</title> <meta name="keywords" content="roenving,http://www.eksperten.dk/spm/525946"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style type="text/css"> html,body{height:100%;margin:0px;border:0px;padding:0px;font-family:tahoma,verdana,arial,sans-serif;font-size:small;} </style> <script language="javascript" type="text/javascript"> var tegn = "abcdefghijkmnpqrstuvwxyz23456789"; var sidsteKode = nyKode = "",actPlads = new Array(),newLength = true; function lavKoder(a,n){ switch(lavKoder.arguments.length){ case 1: n = 300; break; case 0: n = 30; a = "a"; } sidsteKode=a; for(i=0;a.length>i;i++){ actPlads[i] = tegn.indexOf(a.charAt(i)); } for(i=0;n>i;i++){ actPlads[a.length-1]++; if(actPlads[a.length-1]==tegn.length){ newLength = true; for(j=a.length-1;j>=0;j--){ if(tegn.length-1>actPlads[j]){ actPlads[j]++; newLength = false; break; }else{ actPlads[j] = 0; } } if(newLength){ actPlads[a.length] = 0; } }
-- og jeg fandt ingen mærkværdigheder, da jeg bad den om at lave 40000 koder, bortset fra, at browseren brokkede sig over at javascriptet kørte og kørte og kørte og ...
-- og nej !-) jeg checkede ikke alle 40000 koder, men kiggede en del overgange igennem !o]
-- og jeg har lige kigget lidt på den og forberedt den til konvertering til php ...
-- der er stadig en del ting, som skal laves, for adskilige af de funktioner jeg bruger er metoder på objekter, hvor det i php er native funktioner, så det skal lige gennemgås med en tættekam, også variabel-initialiseringen og måske også array-behandlingen skal der sikkert kigges på !-)
function lavKoder($a="a",$n=30){ var $tegn = "abcdefghijkmnpqrstuvwxyz23456789"; var $nyKode = "",$actPlads = new Array(),$newLength = true,$result = new Array(); for($i=0;$a.length>$i;$i++){ $actPlads[$i] = $tegn.indexOf($a.charAt($i)); } $tegn = $tegn.split(""); for($i=0;$n>$i;$i++){ $actPlads[$a.length-1]++; if($actPlads[$a.length-1]==$tegn.length){ $newLength = true; for($j=$a.length-1;$j>=0;$j--){ if($tegn.length-1>$actPlads[$j]){ $actPlads[$j]++; $newLength = false; break; }else{ $actPlads[$j] = 0; } } if($newLength){ $actPlads[$a.length] = 0; } } $nyKode = ""; for($j=0;$actPlads.length>$j;$j++){ $nyKode += $tegn[$actPlads[$j]]; } /*Her skal der laves database-opslag, for at validere $nyKode*/ $a = $nyKode; $result[$result.length] = $nyKode; } return $result; }
Det største problem er hvordan jeg kobler det sammen med databasen. Der skal nemlig ikke genereres en lang række tegnsæt i ét hug, men istedet et af gangen over en længere periode. Derfor skal den undersøge det i databasen senest indsatte, og generere det nye tegnsæt derud fra.
fx:
13/07 2004 er indsat "abc" 04/08 2004 hentes "abc", og der lægges én til, hvorefter "abd" indsættes i databasen
Jeg har jo lavet det som en funktion, der som parametre tager den som ligger lige før og så antallet, så grundlæggende skal den bare lægges ind og kaldes med f.eks.
$kode = lavKoder($gammelKodeFraDatabasen,1);
-- og hvis du altid kun laver en ad gangen, kan du jo helt skippe tælleren og den yderste løkke og den ekstra $result-variabel ...
Nogle af disse linier giver ingen mening i mit hoved (jaja... jeg ER en js-spasser): var $nyKode = "",$actPlads = new Array(),$newLength = true,$result = new Array(); $actPlads[$i] = $tegn.indexOf($a.charAt($i)); $a.length-1 $result[$result.length] = $nyKode;
Kan du overtales til at tilføje nogle flere kommentarer til scriptet?
var $nyKode = "",$actPlads = new Array(),$newLength = true,$result = new Array();
er en forkortelse af en initialisering af en række variabler:
nyKode som en tom tekstvar, actPlads som et array (aktuelt til at holde integers !-) newLength som boolean true result som et array (aktuelt til at holde koder (dvs. tekst), som skal returneres !-)
$actPlads[$i] = $tegn.indexOf($a.charAt($i));
er tilsvarende initialiseringen af startværdierne i actPlads-arrayet med at der slås op i reference-strengen og findes ud af, hvor i den streng den enkelte karakter i start-variablen findes ...
.length på en tekst-variabel returnerer strengens længde, den hedder vist length($a) i php ...
.length på et array returnerer antallet af elementer i arrayet, og ved at give en værdi til elementet med det nummer vil man udvide antallet af elementer i arrayet, da det jo er nul-baseret (det har 1 element, når kun array[0] eksisterer !-)
-- håber det bringer dig længere, ellers må du jo spørge ...
-- specielt problemer omkring arrays havde jeg forventet, for jeg ved faktisk ikke hvordan man behandler sådanne i php, mange andre ting havde jeg fornemmelser af !o]
exp - jeg spammer lige http://www.eksperten.dk/spm/526104 - Ville egentligt oprette det som tråd på ebruger, men kanikke huske mit password og kan ikke hente det via "glemt password"
Vi starter med at have en kode, vi starter fra, f.eks. 'fa8' (1. parameter i kaldet)
Derefter 'oversætter' vi det til et array, som indeholder de pladser, som de indeholdte tegn står på i reference-strengen, her 5,0,30
-- for nemmere at adressere de bogstaver vi skal bygge den enkelte kode af, splitter vi referencen i enkelt-tegn, så den jo så er et array med 32 elementer
Her starter den ydre løkke, som generer det antal koder, der bedes om (2. parameter i kaldet)
Vi markerer lige, at vi måske skal udvide kodens længde, for der laves en ny kode
Først lægger vi en til den sidste plads actPlads-arrayet
Er det så lig med antallet af elementer i reference-strengen/arrayet, skal der ske noget, for det index findes ikke
-- ved første gennemløb findes det problem ikke, så vi hopper direkte udenom
og danner den ny kode ved simpelthen at slå op i reference-strengen/arrayet, med actPlads-værdierne som index og konkatenere dem 5,0,31 --> 'fa9'
Den tilføjes så som et nyt element til relsult-arrayet
-- ved andet gennemløb bliver det tredje element i actArray inkrementeret til 32 og det er netop antallet af elementer i reference-strengen/arrayet, så vi hopper ind i den indre løkke, hvor de øvrige tegn i koden gennemløbes bagfra ...
Hvor første aktion er at sætte det sidste element i actArray til 0 (a skal følge efter 9 !-)
Hvorefter næstsidste element inkrementeres med 1 og faktisk testes på næsten samme måde som sidste element, men da vi ikke skal foretage os yderligere og skal have aflyst udvidelsen af kodelængden, skal vi foretage os noget, selvom vi ikke rammer grænseværdien, så der er byttet om på inkrementeringen og testen, så det er det der forklares i næste afsnit ...
Så først tester vi om vi kan tillade os at inkrementere det næstsidste element, og da vi godt kan tillade os at gøre det, gør vi det, og samtidig aflyser vi udvidelsen af kodelængden, og tilsidst hopper vi ud af løkken, da der ikke er grund til at foretage os noget på det tredjesidste element ...
Så tester vi om der stadig skal udvides, her skal der ikke, så det hopper vi over og konverterer igen til en kode: 5,1,0 --> 'fba' som også føjes til result-arrayet ...
Hvis vi nu havde haft det tilfælde, at vi ikke havde kunnet tillade os at inkrementere nogen af koderne (vi var startet det aktuelle gennemløb med bar 9-taller !-) ville alle de indre tests have resulteret i, at det andet alternativ, næste tegn på en plads er blevet sat til et a, og udvidelsen af koden ville have stået ved magt, og dermed have resulteret i, at actPlads-arrayet var blevet udvidet med et element af værdien nul ...
Ved den efterfølgende konvertering ville vi altså få en kode, som var en længere end den foregående, bestående af bar a'er ...
Når den ydre løkke er gennemløbet det fastsatte antal gange, returnerer vi resultat-arrayet !-)
så lige dit link fra ebruger.dk, og ser også at du allerede har fået masser af svar. Gider dog hverken at læse koden du har fået igennem (da den er javascript) eller tilhørende tekst, da den efter min mening er en smule lang at skulle læse igennem blot for at ligge et svar! Så ved ikke om du har fået svar på dit spørgsmål eller ej, så brug min kode hvis du "får lyst"!
Kan stort set ikke se hvad problemet egentligt er. Er det ikke blot bare at gå din kode igennem bagfra og herved analysere hvert enkelt tegn ud fra et array. I tilfælde af at tegnet ligger midt i arrayet tages den næste post, i tilfælde af tegnet er det sidste i arrayet får tegnet status som tegn ét hvorefter næste tegn analyseres?
en hurtig kode uden nogen form for konkrol af hvorvidt tegnene findes i den allerede gennerede kode, kunne se således ud:
hvis du også ønsker kontrol af fejl i kode i forhold til char-arrayet kan funktionen in_array ( http://dk.php.net/manual/en/function.in-array.php ) benyttes. Men det må du selv sidde og lege lidt med! :)
Nopes - jeg vil gerne have $charset splittet op i at array med et tegn pr. key
egentlig det samme som du gør her: array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
bare uden ' og ,
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.